package com.xyc.javase.collectiontest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Version 1.0
 * @Author:徐衍程
 * @Date:2022/5/27
 * @Content:
 */
public class MapTest {
    /**
     * 这个类不能嵌套在类MapTest中，否则报错：无法从静态上下文中引用非静态变量 this
     * 解决办法：
     * 1.将Person类从MapTest类中拿出来
     * 2.将Person定义为静态类
     * 一般就是将将Student类从MapTest类中拿出来
     */
    static class Person {
        private String name;
        private String phoneNumber;

        public Person(String name, String phoneNumber) {
            this.name = name;
            this.phoneNumber = phoneNumber;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPhoneNumber() {
            return phoneNumber;
        }

        public void setPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }
    }

    public static void main(String[] args) {
        //ListToMap:在使用 java.util.stream.Collectors 类的 toMap() 方法转为 Map 集合时，一定要注意当 value 为 null 时会抛 NPE 异常。
        listToMap();
    }

    private static void listToMap() {
        List<Person> bookList = new ArrayList<>();
        bookList.add(new Person("jack","18163138123"));
        bookList.add(new Person("martin",null));
        // 空指针异常
//        Map<String, String> collect = bookList.stream().collect(Collectors.toMap(Person::getName, Person::getPhoneNumber));
        //解决方案1：不用toMap方法,null数据保留
        Map<String, String> tomap1 = bookList.stream()
                .collect(HashMap::new, (m, v)->m.put(v.getName(), v.getPhoneNumber()), HashMap::putAll);
        System.out.println("tomap1:"+tomap1.toString());
        //解决方案2：在流中加上判空过滤，null数据不保留
        Map<String , String> tomap2 = bookList.stream().filter(t -> t.getPhoneNumber() != null)
                .collect(Collectors.toMap(Person::getName, Person::getPhoneNumber));
        System.out.println("tomap2:"+tomap2.toString());
    }

}
